package usj.pop3.client;


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import usj.smtp.client.SmtpClientNew;

public class Pop3Client {

	public static Properties preferenciasClientePop3 = null;
	/*** puerto por defecto */
	public static int DEFAULT_POP3_PORT = 111;
	/*** servidor por defecto */
	public static String DEFAULT_POP3_SERVER = "localhost";
	public static String DEFAULT_USER = "jaime@localhost";
	public static String DEFAULT_PASSWORD = "1234";

	/*** puerto */
	private static int puerto = DEFAULT_POP3_PORT;
	private static String servidor = DEFAULT_POP3_SERVER;
	private Socket sConex = null;
	private BufferedReader entrada;
	private PrintWriter salida;
	public enum Estados {DESCONECTANDO, DESCONECTADO, CONECTANDO, CONECTADO, ESPERANDOPETUSUARIO, ESPERANDOPETPASS, AUTENTIFICADO,
		ENVIADO_HELO,
		HAYQUEENVIARMAILFROM,
		MAILFROMINTRODUCIDO,
		HAYQUEENVIARRCPTTO,
		RCPTTOINTRODUCIDO,
		HAYQUEENVIARDATA,
		INTRODUCIENDODATA,
		DATACOMPLETO};
	private Estados estado = Estados.DESCONECTADO;
	private String usuario = null;
	private String password = "1234";

	public void desconectar() {
		salida.println("QUIT");
		String cerrando = null;
		try {
			cerrando = entrada.readLine();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		if ((cerrando.contains("Service closing")))
			try {
				if (sConex != null) sConex.close();
			} catch (Exception e) {
			}
	}

	private boolean esRespuestaPositiva(String cadenaRespuesta) {
		boolean res = false;
		if (cadenaRespuesta != null && cadenaRespuesta.contains("+OK")) {
			res = true;
		}
		return res;
	}

	private boolean esRespuestaNegativa(String cadenaRespuesta) {
		boolean res = false;
		if (cadenaRespuesta != null && cadenaRespuesta.contains("-ERR")) {
			res = true;
		}
		return res;
	}

	/**
	 * Autentifica al usuario
	 * @param usuario
	 * @param password
	 * @return
	 */
	private boolean autentificarse(String usuario, String password) {
		boolean res = false;
		//password se ignora de momento
/*		if (estado == Estados.CONECTADO) {
			try {
				if (dameCodigoSmtp(entrada.readLine()) == 220) {
				//nos ha saludado el servidor, le respondemos con un hello.
					salida.println("HELO " + usuario);
					if (dameCodigoSmtp(entrada.readLine()) == 250) {
						res = true;
						estado = Estados.AUTENTIFICADO;
					}
				}
			} catch (IOException e) {
				//no se puede leer la linea, salimos
				res = false;
			}
		}*/
		return res;
	}

	public boolean conectar() {
		boolean res = false;
			cargaFicheroPreferencias();
		// conectar con el servidor y crear el socket para la transmision
		   try {
			sConex = new Socket(servidor, puerto);
			sConex.setReuseAddress(true);
			entrada = new BufferedReader(new InputStreamReader(sConex.getInputStream()));
			salida = new PrintWriter(sConex.getOutputStream(), true);
			if (sConex != null && entrada!= null && salida != null) {
				estado = Estados.CONECTADO;
				res = autentificarse(usuario, password); 
			}
		} catch (UnknownHostException e) {
			System.out.println("no se encuentra el servidor " + servidor);
			res = false;
		} catch (IOException e) {
			System.out.println("ERROR! no se puede conectar al puerto " + puerto + " del servidor " + servidor);
			res = false;
		}
		  return res;
	}

	private boolean cargaFicheroPreferencias() {
		boolean res = false;
		try {
			FileInputStream in = new FileInputStream("clientesmtp.properties");
			preferenciasClientePop3 = new Properties();
			preferenciasClientePop3.load(in);
			in.close();
			res = true;

			//ahora deberiamos leer properties para cargar puerto, servidor, usuario y clave.
			if (preferenciasClientePop3 != null) {
				String strPuerto = preferenciasClientePop3.getProperty("puerto", String.valueOf(DEFAULT_POP3_PORT));
				if ((strPuerto != null) && (strPuerto.length() > 0)) {
					try{
						puerto = Integer.parseInt(strPuerto);
					} catch (NumberFormatException e) {
						System.out.println("no se reconoce el puerto, usando puerto " + DEFAULT_POP3_PORT + " por defecto");
						puerto = DEFAULT_POP3_PORT;
					}
				}
				usuario = preferenciasClientePop3.getProperty("usuario", String.valueOf(DEFAULT_USER));
				password = preferenciasClientePop3.getProperty("password", String.valueOf(DEFAULT_PASSWORD));
				if (usuario == null || (usuario != null && usuario.length()<1)) {
					System.out.println("ERROR: no hay una propiedad usuario con su correo en el fichero de preferencias clientepop3.properties");
				}
				if (password == null || (password != null && password.length()<1)) {
					System.out.println("ERROR: no hay una propiedad password en el fichero de preferencias clientepop3.properties");
				}
			}
		} catch (FileNotFoundException e) {
			System.out.println("No se encuentra el fichero clientesmtp.properties con las preferencias del cliente smtp");
			res = false;
		} catch (IOException e) {
			e.printStackTrace();
			res = false;
		}
		return res;
	}

	public static int getPuerto() {
		return puerto;
	}

	public static void setPuerto(int puertoPar) {
		puerto = puertoPar;
	}

	public static void main(String[] args) throws IOException {
    	System.out.println("arrancando cliente...");
		SmtpClientNew smtpClientNew = new SmtpClientNew();
		if (smtpClientNew.conectar()) {
			System.out.println("conectado e identificado");
			List<String> receptoresprueba = new ArrayList<String>();
			receptoresprueba.add("jaime@localhost");
			if (smtpClientNew.enviarCorreo(receptoresprueba, "HOLA QUE TAL ESTO ES UNA PRUEBA")) {
				System.out.println("mensaje enviado");
			}
		}
	}

}
